//次:ピ～ン音を2次IIRによる指数減衰で
// ->ピ～ン音を2相指数減衰で

const f=880;//"f"は周波数（Hz）
      T=0.2;//"T"は減衰時間（秒）
var
  fs,r,w, ds,dc,ws,wc,wk:Double;
  i,j:Integer;
procedure Main();
begin
  fs:=cmd('fs');  // "fs"はサンプルレートでマウス右ボタンで設定出来ます
  r:=exp(-1/fs/T);
   w:=2*PI()*f/fs;  //"w"
   ws:=sin(w)*r;
   wc:=cos(w)*r;
//初期値
   dc:=$7F00;      //7f00は16bit正の最大が$7fffなので最大振幅付近程度の意味です
   ds:=0;
 for j:=0 to round(T*9.0) do begin
   for i:=1 to trunc(fs) do begin
    wk:=ds;
    ds:=ds*wc+dc*ws;  // wc wsが係数 dc　dsgaが変数
    dc:=dc*wc-wk*ws;  //        wc = cos(w0)    ws = sin(w0)
    if not OutData(Trunc(ds)) then exit;//GUIでF9を押せば途中falseになります
   end;
  if isStop then exit; //GUIでF9を押せばtrueになります
  end;
end;
{
たいていの音はなり続けるのではなく減衰します。
一般的には指数減衰となります

指数減衰を入れてもループ中の処理が変化してない事に注目して下さい

//次:ピ～ン音を2次IIRによる指数減衰で

}